import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
# 设置matplotlib使用支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号
# 数据
t = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
y = np.array([356, 278, 190, 160, 142, 109, 105, 60, 56, 38, 36, 32, 21, 19, 15])
# 定义拟合函数（指数衰减）
def exp_decay(t, a, b):
    return a * np.exp(-b * t)
# 进行非线性拟合
params, covariance = curve_fit(exp_decay, t, y, p0=[350, 0.2])
# 获取拟合参数
a_fit, b_fit = params
print(f"拟合结果：y = {a_fit:.2f} * exp(-{b_fit:.4f} * t)")
# 生成拟合曲线数据
t_fit = np.linspace(1, 15, 100)
y_fit = exp_decay(t_fit, a_fit, b_fit)
# 绘图展示原始数据和拟合曲线
plt.figure(figsize=(10, 6))
plt.scatter(t, y, color='red', label='实验数据')
plt.plot(t_fit, y_fit, 'b-', label='指数拟合曲线')
plt.xlabel('照射次数 t')
plt.ylabel('细菌数量 y')
plt.title('X射线杀菌效果 - 指数衰减拟合')
plt.legend()
plt.grid(True)
plt.show()